#ifndef PAGEDISPLAYSTRATEGYFACTORY_H
#define PAGEDISPLAYSTRATEGYFACTORY_H

#include <memory>

class PageDisplayStrategy;

/**
 * @brief Martin Fowler重构：Strategy Factory
 *
 * 策略模式工厂：
 * - Factory Method: 创建合适的显示策略
 * - Singleton: 全局策略管理
 * - Cache: 策略实例复用
 */
class PageDisplayStrategyFactory
{
public:
    /**
     * @brief 显示策略类型
     */
    enum StrategyType {
        Simple,        // 简单显示（原图，无页码）
        PageNumber,    // 页码显示（原图+页码）
        Export         // 导出显示（完整处理）
    };

    /**
     * @brief 获取工厂实例
     */
    static PageDisplayStrategyFactory& instance();

    /**
     * @brief 创建显示策略
     *
     * @param type 策略类型
     * @return 策略实例（智能指针）
     */
    std::shared_ptr<PageDisplayStrategy> createStrategy(StrategyType type);

    /**
     * @brief 根据上下文自动选择策略
     *
     * @param isExportMode 是否为导出模式
     * @param needsPageNumber 是否需要页码
     * @return 策略类型
     */
    StrategyType selectStrategy(bool isExportMode, bool needsPageNumber);

private:
    PageDisplayStrategyFactory() = default;
    ~PageDisplayStrategyFactory() = default;

    // 禁用拷贝和赋值
    PageDisplayStrategyFactory(const PageDisplayStrategyFactory&) = delete;
    PageDisplayStrategyFactory& operator=(const PageDisplayStrategyFactory&) = delete;

    // 策略缓存
    std::shared_ptr<PageDisplayStrategy> m_simpleStrategy;
    std::shared_ptr<PageDisplayStrategy> m_pageNumberStrategy;
    std::shared_ptr<PageDisplayStrategy> m_exportStrategy;
};

#endif // PAGEDISPLAYSTRATEGYFACTORY_H